<?php

namespace app\api\controller;

use app\common\controller\Api;
use think\Db;
use QL\QueryList;
use GuzzleHttp\Cookie\CookieJar;
// use Spatie\Browsershot\Browsershot;


use QL\Ext\Chrome;


/**
 * 在线HTTP访问
 * 
 */
class Http extends Api
{

    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['*'];

  

    /**
     * 在线get🕸
     * 
     * @ApiSummary  (如果识别有问题请联系QQ496631085)
     *
     * @param string $url GET地址
     * @param string $json 返回json格式，默认假
     * 
     * @return void
     */
    public function get($url,$header=null,$cookie=null,$json=false)
    {
       
        if($url){
            if (filter_var($url, FILTER_VALIDATE_URL) !== false) {

            }else{
                $this->error('地址不正确');
            }
        }


        if(!$header){
            $headers= [
                //'Cookie'=>$_COOKIE,
            'User-Agent'    => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36',
            'Content-Type'  => 'application/x-www-form-urlencoded; charset=UTF-8'];
        }else{
            //分割
            $headers = $header;
        }
      

    
        $data = QueryList::get($url,null,['headers'=>$headers]);
        
        if(strlen($data->getHtml())>0){
            if(!$json){
                echo $data->getHtml();
                exit();
            }
            $this->success(strlen($data->getHtml()), $data->getHtml());
        }else{
            $this->error('访问识别失败');
        }
 
        // $post['img']=$url;
        // $post['filename'] = null;
        // $post['de_type'] = 'url';
        // $post['_token'] = $data->find('meta[name=csrf-token]')->content;

        // $ql = $data->post($geturl,$post,['headers'=>$headers2]);
        // $str = $ql->getHtml();

        // $json = json_decode($str,true);
        // if($json['status']==1){
        //     $this->success($json['info'], $json['content'][0][0]);
        // }else{
        //     $this->error('失败,请联系QQ496631085');
        // }

        
    }

    /**
     * 谷歌浏览器获取🕸
     * 
     * @ApiSummary  ("谷歌浏览器获取🕸")
     *
     * @param string $url GET地址(请带http)
     * @param string $json 返回json格式，默认假
     * 
     * @return void
     */
    public function chrome_get($url=null,$json=false)
    {
        // exit('python3 '.ROOT_PATH.'chrome_http.py'.' '.$url);
        $text = shell_exec('python3 '.ROOT_PATH.'chrome_http.py'.' '.$url);
        if(!$json){
            echo $text;
            exit();
        }
        $this->success(strlen($text), $text);        
    }


    /**
     * Curl获取🕸
     * 
     * @ApiSummary  ("Linux Curl获取🕸")
     *
     * @param string $url GET地址(请带http)
     * @param string $json 返回json格式，默认假
     * 
     * @return void
     */
    public function curl_get($url=null,$json=false)
    {
        $text = shell_exec('curl -L '.$url);
        if(!$json){
            halt($text);
            exit();
        }
        $this->success(strlen($text), $text);
    }


    /**
     * 在线get2🕸
     * 
     * @ApiSummary  (如果有问题请联系QQ496631085)
     *
     * @param string $url GET地址
     * @param string $json 返回json格式，默认假
     * 
     * @return void
     */
    public function get2($url=null,$json=false)
    {
        
        // Browsershot::url($url)->save('2.jpg');
        //本代码调用java的采集接口返回 请配合相关的jar来实现
        $data = QueryList::post("http://127.0.0.1:8881/http_get",['url'=>$url]);
        
        if(strlen($data->getHtml())>0){
            $arr = json_decode($data->getHtml(),true);
            if(!$json){
                echo $data->getHtml();
                exit();
            }
            $this->success(strlen($arr['data']), $arr['data']);
        }else{
            $this->error('访问识别失败');
        }
    }
    
    
    
    /**
     * 在线get3🕸
     * 
     * @ApiSummary  ("一般用于vue等js渲染")
     *
     * @param string $url GET地址
     * @param int $delay 延时多久返回结果，默认5秒
     * @param string $json 返回json格式，默认假
     * 
     * @return void
     */
    public function get3($url=null,$delay=5,$json=false)
    {
        $ql = QueryList::getInstance();
  
        // 注册插件，默认注册的方法名为: chrome
        $ql->use(Chrome::class);
        // 或者自定义注册的方法名
        $ql->use(Chrome::class,'chrome');

        // 抓取的目标页面是使用Vue.js动态渲染的页面
        $url = 'https://www.iviewui.com/components/button';
        $url = 'https://www.xiaohongshu.com/discovery/item/5e90937a0000000001008cf2';
        // $text = $ql->chrome($url,[
        //       'timeout' => 6000,
        //       'ignoreHTTPSErrors' => true,
        //       // ...
        //     ])
        // ->gethtml();
        // ->find('h1')
        // ->text();
        // halt($text);
        // halt($ql);   

        // $text = $ql->chrome('https://www.iviewui.com/components/button',[
        //     'timeout' => 6000,
        //     'ignoreHTTPSErrors' => false,
        //     // ...
        //   ])->find('h1')->text();
        
        //   halt($text);
        // $rules = [
        //  'h1' => ['h1','text']
        // ];
        // $ql = $ql->chrome('https://www.iviewui.com/components/button');
        // $data = $ql->rules($rules)->queryData();
        // halt($data);
        // 输出: Button 按钮
        
        
                
        //         启动可视化Chrome浏览器

        // 运行下面代码后会启动一个Chrome浏览器。


        $text = $ql->chrome(function ($page,$browser) {
            $page->goto('https://www.xiaohongshu.com/discovery/item/5e90937a0000000001008cf2');
               sleep(5);
            $html = $page->content();
            // 这里故意设置一个很长的延长时间，让你可以看到chrome浏览器的启动
         
            $browser->close();
            // 返回值一定要是页面的HTML内容
            return $html;
        },[
         'headless' => false, // 启动可视化Chrome浏览器,方便调试
         'devtools' => false, // 打开浏览器的开发者工具
         ' args'=>['--no-sandbox', '--disable-setuid-sandbox'],
        ])->getHtml();
        //   halt(1);
        
        if(!$json){
            echo $text;
            exit();
        }
        $this->success(strlen($text), $text);
    }

    /**
     * 输入Query
     *
     * @param string $url 采集的网址
     * @param string $html 网址和源码各选一个
     * @param string $str
     * @return void
     */
    public function get4($url,$str='a')
    {
        $ql = QueryList::get($url);
        $data['texts'] = $ql->find($str)->texts();
        $data['htmls'] = $ql->find($str)->htmls();
        $data['all'] = $ql->find($str);
        $this->success('ok', $data);
    }

}
